package com.example.demo.myException;

import com.example.demo.entity.BaseRespEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 全局异常拦截处理
 *
 * @ExceptionHandler(异常类.class) 情况1：定义了一个exception（最大异常类），定义了一个NullPointerException（空指针异常类），系统会根据定义的最小异常定义抛出，没有定义就最后以exception定义处理
 * 情况2：如果注解用来指明异常的处理类型，即如果这里指定为 NullpointerException，没有@ExceptionHandler其他定义异常处理，则数组越界异常就不会进到这个方法中来。
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 统一异常处理方法空指针异常，有NullPointerException异常会在这个方法执行异常处理不会走到Exception那边处理
     *
     * @param e
     * @return
     */
    @ExceptionHandler(NullPointerException.class)
    @ResponseBody
    public Object NullPointerExceptionHandler(NullPointerException e) {
        e.printStackTrace();
        return new BaseRespEntity("101", "空指针" + e.getMessage()).toString();
    }

    /**
     * 统一异常处理方法-自定异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(MyDefineException.class)
    @ResponseBody
    public Object MyDefineExceptionHandler(MyDefineException e) {
        e.printStackTrace();
        return new BaseRespEntity("102", "自定义异常：" + e.getMessage()).toString();
    }

    /**
     * 默认统一异常处理方法
     *
     * @ExceptionHandler 注解用来配置需要拦截的异常类型, 也可以是自定义异常
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Object runtimeExceptionHandler(Exception e) {
        //输出异常栈信息
        e.printStackTrace();
        // 使用公共的结果类封装返回结果
        return new BaseRespEntity("500", e.getMessage()).toString();
    }
}
